package paneles;

import arreglos.ClienteArrayList;
import com.toedter.calendar.JDateChooser;
import com.toedter.calendar.JSpinnerDateEditor;
import constantes.Constantes;
import entidades.Cliente;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import principal.Principal;
import util.Utilitarios;
import util.Validaciones;

public class PanelAgregarCliente extends JPanel implements ActionListener {

	private JLabel lblAgregarClienteTitulo;
	// ///Datos del formulario

	private JLabel lblNombreCliente;
	private JLabel lblApePaternoCliente;
	private JLabel lblApeMaternoCliente;
	private JLabel lblDNI;
	private JLabel lblDireccionCliente;
	private JLabel lblFechaNacimientoCliente;
	private JLabel lblTarjetaBonus;
	private JLabel lblPuntos;
	private JLabel lblTelefono;
	private JLabel lblEmail;

	private JTextField txtNombreCliente;
	private JTextField txtApePaternoCliente;
	private JTextField txtApeMaternoCliente;
	private JTextField txtDNI;
	private JTextField txtDireccionCliente;
	private JDateChooser txtFechaNacimientoCliente;
	private JTextField txtTarjetaBonus;
	private JTextField txtPuntos;
	private JTextField txtTelefono;
	private JTextField txtEmail;
	
	private JButton btnAgregarCliente;
	private JButton btnLimpiarCliente;
	private JInternalFrame agregarCliente;

	public PanelAgregarCliente(Principal pAppletPrincipal,
			JInternalFrame pAgregarCliente) {

		this.agregarCliente = pAgregarCliente;

		lblAgregarClienteTitulo = new JLabel("Nuevo cliente", JLabel.CENTER);
		lblAgregarClienteTitulo.setBounds(0, 35, 500, 35);
		lblAgregarClienteTitulo.setForeground(Color.red);
		lblAgregarClienteTitulo.setOpaque(true);
		// lblAgregarClienteTitulo.setBackground(Color.white);
		lblAgregarClienteTitulo.setFont(new Font("Dialog", Font.BOLD, 18));
		this.add(lblAgregarClienteTitulo);

		lblNombreCliente = new JLabel("Nombres:", JLabel.RIGHT);
		lblNombreCliente.setBounds(0, 75, 210, 25);
		lblNombreCliente.setForeground(Color.red);
		lblNombreCliente.setOpaque(true);
		// lblNombreCliente.setBackground(Color.white);
		lblNombreCliente.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(lblNombreCliente);

		lblApePaternoCliente = new JLabel("Apellido paterno:", JLabel.RIGHT);
		lblApePaternoCliente.setBounds(0, 100, 210, 25);
		lblApePaternoCliente.setForeground(Color.red);
		lblApePaternoCliente.setOpaque(true);
		// lblApePaternoCliente.setBackground(Color.white);
		lblApePaternoCliente.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(lblApePaternoCliente);

		lblApeMaternoCliente = new JLabel("Apellido materno:", JLabel.RIGHT);
		lblApeMaternoCliente.setBounds(0, 125, 210, 25);
		lblApeMaternoCliente.setForeground(Color.red);
		lblApeMaternoCliente.setOpaque(true);
		// lblApeMaternoCliente.setBackground(Color.white);
		lblApeMaternoCliente.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(lblApeMaternoCliente);

		lblDNI = new JLabel("DNI:", JLabel.RIGHT);
		lblDNI.setBounds(0, 150, 210, 25);
		lblDNI.setForeground(Color.red);
		lblDNI.setOpaque(true);
		// lblTelefonoCliente.setBackground(Color.white);
		lblDNI.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(lblDNI);

		lblDireccionCliente = new JLabel("Direccion:", JLabel.RIGHT);
		lblDireccionCliente.setBounds(0, 175, 210, 25);
		lblDireccionCliente.setForeground(Color.red);
		lblDireccionCliente.setOpaque(true);
		lblDireccionCliente.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(lblDireccionCliente);

		lblFechaNacimientoCliente = new JLabel("Fecha nacimiento:",
				JLabel.RIGHT);
		lblFechaNacimientoCliente.setBounds(0, 200, 210, 25);
		lblFechaNacimientoCliente.setForeground(Color.red);
		lblFechaNacimientoCliente.setOpaque(true);
		lblFechaNacimientoCliente.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(lblFechaNacimientoCliente);

		lblTarjetaBonus = new JLabel("Tarjeta Bonus:", JLabel.RIGHT);
		lblTarjetaBonus.setBounds(0, 225, 210, 25);
		lblTarjetaBonus.setForeground(Color.red);
		lblTarjetaBonus.setOpaque(true);
		lblTarjetaBonus.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(lblTarjetaBonus);

		lblPuntos = new JLabel("Puntos:", JLabel.RIGHT);
		lblPuntos.setBounds(0, 250, 210, 25);
		lblPuntos.setForeground(Color.red);
		lblPuntos.setOpaque(true);
		lblPuntos.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(lblPuntos);
		
		lblTelefono = new JLabel("Telefono:", JLabel.RIGHT);
		lblTelefono.setBounds(0, 275, 210, 25);
		lblTelefono.setForeground(Color.red);
		lblTelefono.setOpaque(true);
		lblTelefono.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(lblTelefono);
		
		lblEmail = new JLabel("Email:", JLabel.RIGHT);
		lblEmail.setBounds(0, 300, 210, 25);
		lblEmail.setForeground(Color.red);
		lblEmail.setOpaque(true);
		lblEmail.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(lblEmail);

		txtNombreCliente = new JTextField();
		txtNombreCliente.setBounds(215, 75, 200, 20);
		txtNombreCliente.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(txtNombreCliente);

		txtApePaternoCliente = new JTextField();
		txtApePaternoCliente.setBounds(215, 100, 200, 20);
		txtApePaternoCliente.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(txtApePaternoCliente);

		txtApeMaternoCliente = new JTextField();
		txtApeMaternoCliente.setBounds(215, 125, 200, 20);
		txtApeMaternoCliente.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(txtApeMaternoCliente);

		txtDNI = new JTextField();
		txtDNI.setBounds(215, 150, 200, 20);
		txtDNI.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(txtDNI);

		txtDireccionCliente = new JTextField();
		txtDireccionCliente.setBounds(215, 175, 200, 20);
		txtDireccionCliente.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(txtDireccionCliente);

		txtFechaNacimientoCliente = new JDateChooser(null, null, null,
				new JSpinnerDateEditor());
		txtFechaNacimientoCliente.setBounds(215, 200, 200, 20);
		txtFechaNacimientoCliente.setFont(new Font("Dialog", Font.BOLD, 12));
		/*
		 * Establece la fecha maxima de seleccion para el año de nacimiento
		 */
		Date date = Utilitarios.FechaMaximaDeSeleccion();
		txtFechaNacimientoCliente.setMaxSelectableDate(date);
		txtFechaNacimientoCliente.setDate(date);
		this.add(txtFechaNacimientoCliente);

		txtTarjetaBonus = new JTextField();
		txtTarjetaBonus.setBounds(215, 225, 200, 20);
		txtTarjetaBonus.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(txtTarjetaBonus);

		txtPuntos = new JTextField();
		txtPuntos.setBounds(215, 250, 200, 20);
		txtPuntos.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(txtPuntos);
		
		txtTelefono = new JTextField();
		txtTelefono.setBounds(215, 275, 200, 20);
		txtTelefono.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(txtTelefono);

		txtEmail = new JTextField();
		txtEmail.setBounds(215,300, 200, 20);
		txtEmail.setFont(new Font("Dialog", Font.BOLD, 12));
		this.add(txtEmail);

		
		btnAgregarCliente = new JButton("Grabar");
		btnAgregarCliente.setBounds(150, 325, 90, 30);
		btnAgregarCliente.addActionListener(this);
		this.add(btnAgregarCliente);

		btnLimpiarCliente = new JButton("Limpiar");
		btnLimpiarCliente.setBounds(250, 325, 90, 30);
		btnLimpiarCliente.addActionListener(this);
		this.add(btnLimpiarCliente);
	}

	public void actionPerformed(ActionEvent e) {

		if (e.getSource() == btnAgregarCliente) {
			AgregarDatosCliente();
		}
		if (e.getSource() == btnLimpiarCliente) {
			LimpiarDatosCliente();
		}
	}

	private void LimpiarDatosCliente() {
		txtNombreCliente.setText("");
		txtApePaternoCliente.setText("");
		txtApeMaternoCliente.setText("");
		txtDNI.setText("");
		txtDireccionCliente.setText("");
		txtTelefono.setText("");
		txtTarjetaBonus.setText("");
		txtPuntos.setText("");
		txtEmail.setText("");
		txtNombreCliente.requestFocus();		
	}

	/* Permite agregar un cliente */
	private void AgregarDatosCliente() {
		Cliente cliente = null;
		ClienteArrayList clienteArrayList = null;
		try {
			cliente = new Cliente();
			cliente.setNombre(txtNombreCliente.getText().trim());
			cliente.setApellidoPaterno(txtApePaternoCliente.getText().trim());
			cliente.setApellidoMaterno(txtApeMaternoCliente.getText().trim());
			cliente.setDni(txtDNI.getText().trim());
			cliente.setTelefono(txtTelefono.getText().trim());
			cliente.setDireccion(txtDireccionCliente.getText().trim());
			cliente.setEmail(txtEmail.getText().trim());

			Date date = txtFechaNacimientoCliente.getDate();
			String fecha = Utilitarios.FormatearFechaCadena(date);
			cliente.setFechaNacimiento(fecha);
			clienteArrayList = new ClienteArrayList();

			if (ValidarFormularioAgregarClientes(cliente)) {
				// Datos enteros
				cliente.setNumTarjetaBonus(Integer.parseInt(txtTarjetaBonus.getText().trim()));
				cliente.setPuntos(Integer.parseInt(txtPuntos.getText().trim()));
				
				int codigo = clienteArrayList.AgregarCliente(cliente);
				
				if (codigo == Constantes.ERROR_YA_EXISTE_DNI_AGREGAR) {
					Utilitarios.MostrarMensajeAlerta(agregarCliente,
							"Ya se ingreso un cliente con el mismo DNI");
				} else {
					Utilitarios.MostrarMensajeInformacion(agregarCliente,
							"Se agrego un cliente correctamente");
					LimpiarDatosCliente();
				}
			}

			

		} catch (Exception ex) {
		}
	}

	private boolean ValidarFormularioAgregarClientes(Cliente pCliente) {
		boolean resultado = false;
		/* Comprobar si los campos estan vacios */
		if (pCliente.getNombre().equals("")) {
			txtNombreCliente.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente, "Ingrese nombre");
			return false;
		}
		if (pCliente.getApellidoPaterno().equals("")) {
			txtApePaternoCliente.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"Ingrese apellido paterno");
			return false;
		}
		if (pCliente.getApellidoMaterno().equals("")) {
			txtApeMaternoCliente.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"Ingrese apellido materno");
			return false;
		}

		if (pCliente.getDni().equals("")) {
			txtDNI.requestFocus();
			Utilitarios
					.MostrarMensajeAlerta(agregarCliente, "Ingrese DNI");
			return false;
		}
		if (pCliente.getTelefono().equals("")) {
			txtTelefono.requestFocus();
			Utilitarios
					.MostrarMensajeAlerta(agregarCliente, "Ingrese telefono");
			return false;
		}
		if (pCliente.getDireccion().equals("")) {
			txtDireccionCliente.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"Ingrese direccion");
			return false;
		}

		if (pCliente.getFechaNacimiento().equals("")) {
			txtFechaNacimientoCliente.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"Ingrese fecha nacimiento");
			return false;
		}

		/* Comprobar si los datos estan bien ingresados */
		if (!(Validaciones.validarNombres(pCliente.getNombre()))) {
			txtNombreCliente.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"El nombre no es valido");
			return false;
		}
		if (!(Validaciones.validarLongitudCampo(pCliente.getNombre(),
				Constantes.longitudNombre, Constantes.longitudMenor_Que))) {
			txtNombreCliente.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"El nombre no tiene una longitud valida");
			return false;
		}
		if (!(Validaciones.validarNombres(pCliente.getApellidoPaterno()))) {
			txtApePaternoCliente.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"El apellido paterno no es valido");
			return false;
		}
		if (!(Validaciones.validarLongitudCampo(pCliente.getApellidoPaterno(),
				Constantes.longitudApePat, Constantes.longitudMenor_Que))) {
			txtApePaternoCliente.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"El apellido paterno no tiene una longitud valida");
			return false;
		}
		if (!(Validaciones.validarNombres(pCliente.getApellidoMaterno()))) {
			txtApeMaternoCliente.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"El apellido materno no es valido");
			return false;
		}
		if (!(Validaciones.validarLongitudCampo(pCliente.getApellidoMaterno(),
				Constantes.longitudApeMat, Constantes.longitudMenor_Que))) {
			txtApeMaternoCliente.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"El apellido materno no tiene una longitud valida");
			return false;
		}

		if (!(Validaciones.validarSoloNumeros(pCliente.getTelefono()))) {
			txtTelefono.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"El telefono no es valido");
			return false;
		}
		if (!(Validaciones.validarSoloNumeros(pCliente.getDni()))) {
			txtDNI.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"El DNI no es valido");
			return false;
		}
		if (!(Validaciones.validarLongitudCampo(pCliente.getDni(),
				Constantes.longitudDni, Constantes.longitudIgual_A))) {
			txtDNI.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"El DNI no tiene una longitud valida");
			return false;
		}
		if (!(Validaciones.validarDireccion(pCliente.getDireccion()))) {
			txtDireccionCliente.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"La  direccion no es valida");
			return false;
		}
		if (!(Validaciones.validarLongitudCampo(pCliente.getDireccion(),
				Constantes.longitudDireccion, Constantes.longitudMenor_Que))) {
			txtDireccionCliente.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"La  direccian no tiene una longitud valida");
			return false;
		}

		if (!(Validaciones.validarSoloNumeros(txtTarjetaBonus.getText().trim()))) {
			txtTarjetaBonus.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"El numero de tarjeta es solo numeros");
			return false;
		}

		if (!(Validaciones.validarSoloNumeros(txtPuntos.getText().trim()))) {
			txtPuntos.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"El valor de los puntos no es valido");
			return false;
		}
		
		if (!(Validaciones.validarEmail(txtEmail.getText().trim()))) {
			txtEmail.requestFocus();
			Utilitarios.MostrarMensajeAlerta(agregarCliente,
					"El email no es valido");
			return false;
		}

		resultado = true;

		return resultado;
	}
}
